home *** CD-ROM | disk | FTP | other *** search
- /*
- Program to test Message Dispatcher
-
- Written by: Anumele D. Raja
-
- Date: Arpil 19, 1991
-
- Copyright @ Apple Computer, Inc. 1991
-
- This program tests the Message Dispatcher code.
-
- Opens main queue and secondary queue.
- Sets up receive completion for N mCodes starting from 0 in steps of 2
- Then uses the secondary queue to send messages to main queue with
- N mCodes starting from 0 in steps of 2.
- Sets up N completion routines to wait for replies in the secondary queue.
- These completion routines will set flags in the global area
-
- Modification History:
-
- 04/30/91 Raja Added code to test Dispatch calls in main thread itself
-
- */
-
- #include <StdIO.h>
- #include <CursorCtl.h>
- #include <StdLib.h>
- #include <Events.h>
-
- #include "MultiThread.h"
- #include "MessageDispatcher.h"
-
- #define N 8
- #define kNoOfMessages 16
- #define CODE_OFFSET 200
-
- enum { kFalse, kTrue };
-
- // Function declarations
-
- void MainReceive(mMessage *msgPtr);
- void SecReceive0(mMessage *msgPtr);
- void SecReceive1(mMessage *msgPtr);
- void SecReceive2(mMessage *msgPtr);
- void SecReceive3(mMessage *msgPtr);
- void SecReceive4(mMessage *msgPtr);
- void SecReceive5(mMessage *msgPtr);
- void SecReceive6(mMessage *msgPtr);
- void SecReceive7(mMessage *msgPtr);
-
- mMessage *msgRecd[N];
- QueueEntry *secQPtr;
-
- static char object_name [] = "echo manager";
- static char type_name [] = "echo manager";
-
- main()
- {
- tid_type mainTID, secTID, echoTID;
- int i;
- char done;
- mMessage *msgPtr;
- unsigned short index;
-
- if (!(mainTID = OpenQueue(0))) {
- printf("*** Cannot open main queue ***\n");
- exit(1);
- }
-
- if (!(secQPtr = CreateQueue())) {
- printf("*** Cannot create secondary queue ***\n");
- exit(1);
- }
-
- if (!(secTID = secQPtr->OpenQueue(0))) {
- printf("*** Cannot open secondary queue ***\n");
- exit(1);
- }
-
- index = 0;
-
- echoTID = Lookup_Task(object_name, type_name, GetNameTID(), &index);
- printf("Echo TID for main thread %d\n", echoTID);
- printf("Name manager TID for main thread %d\n", GetNameTID());
- index = 0;
-
- echoTID = secQPtr->Lookup_Task(object_name, type_name, secQPtr->GetNameTID(), &index);
- printf("Echo TID for secondary thread %d\n", echoTID);
- printf("Name manager TID for secondary thread %d\n", secQPtr->GetNameTID());
-
- // Open Dispatch for both main and secondary queues
-
- OpenDispatch(kNoOfMessages);
- secQPtr->OpenDispatch(kNoOfMessages);
-
- // In main queue wait for N/2 message codes in N completion routine invocations
-
- for (i = 0; i < N/2; i++) {
- SpecialReceive(OS_MATCH_ALL, OS_MATCH_ALL, i*2 + CODE_OFFSET, 0, MainReceive);
- }
-
- // From secondary queue send N messages to the main queue
-
- for (i = 0; i < N; i++) {
- msgPtr = secQPtr->GetMsg();
- if (msgPtr) {
- msgPtr->mCode = i*2 + CODE_OFFSET;
- msgPtr->mTo = mainTID;
- msgPtr->mOData[0] = TickCount();
- secQPtr->Send(msgPtr);
- }
- }
-
- // Issue multiple receives for the reply messages in secondary queue
-
- secQPtr->Receive(OS_MATCH_ALL, mainTID, 1 + CODE_OFFSET, 0, SecReceive0);
-
- secQPtr->Receive(OS_MATCH_ALL, mainTID, 3 + CODE_OFFSET, 1, SecReceive1);
-
- secQPtr->Receive(OS_MATCH_ALL, mainTID, 5 + CODE_OFFSET, -1, SecReceive2);
-
- secQPtr->Receive(OS_MATCH_ALL, mainTID, 7 + CODE_OFFSET, 100, SecReceive3);
-
- if ((msgRecd[4] = secQPtr->Receive(OS_MATCH_ALL, mainTID, 9 + CODE_OFFSET, -1, 0)) == 0)
- msgRecd[4] = (mMessage *)-1;
-
- if ((msgRecd[5] = secQPtr->Receive(OS_MATCH_ALL, mainTID, 11 + CODE_OFFSET, 100, 0)) == 0)
- msgRecd[5] = (mMessage *)-1;
-
- index = 0;
-
- echoTID = Lookup_Task(object_name, type_name, GetNameTID(), &index);
- printf("Echo TID for main thread %d\n", echoTID);
- printf("Name manager TID for main thread %d\n", GetNameTID());
- index = 0;
-
- echoTID = secQPtr->Lookup_Task(object_name, type_name, secQPtr->GetNameTID(), &index);
- printf("Echo TID for secondary thread %d\n", echoTID);
- printf("Name manager TID for secondary thread %d\n", secQPtr->GetNameTID());
-
- // wait for another N/2 messages codes
-
- for (i = N/2; i < N; i++) {
- SpecialReceive(OS_MATCH_ALL, OS_MATCH_ALL, i*2 + CODE_OFFSET, 0, MainReceive);
- }
-
- if ((msgRecd[6] = secQPtr->Receive(OS_MATCH_ALL, mainTID, 13 + CODE_OFFSET, -1, 0)) == 0)
- msgRecd[6] = (mMessage *)-1;
-
- if ((msgRecd[7] = secQPtr->Receive(OS_MATCH_ALL, mainTID, 15 + CODE_OFFSET, -1, 0)) == 0)
- msgRecd[7] = (mMessage *)-1;
-
- done = kFalse;
-
- // Now wait for all messages to be received by the secondary completion routines
-
- while (!done) {
- done = kTrue;
- for (i = 0; i < N; i++) {
- if (!msgRecd[i]) {
- done = kFalse;
- }
- }
- }
-
- // Print out the messages codes and the times
-
- for (i = 0; i < N; i++) {
- if (msgRecd[i] != -1) {
- printf("Message %08X %d %d %d %d\n", msgRecd[i], msgRecd[i]->mCode, msgRecd[i]->mOData[0],
- msgRecd[i]->mOData[1], msgRecd[i]->mOData[2]);
- } else {
- printf("No message\n");
- }
- }
-
- // Close dispatch for both main and secondary queues
-
- CloseDispatch();
- secQPtr->CloseDispatch();
-
- echoTID = Lookup_Task(object_name, type_name, GetNameTID(), &index);
- printf("Echo TID for main thread %d\n", echoTID);
- printf("Name manager TID for main thread %d\n", GetNameTID());
- index = 0;
-
- echoTID = secQPtr->Lookup_Task(object_name, type_name, secQPtr->GetNameTID(), &index);
- printf("Echo TID for secondary thread %d\n", echoTID);
- printf("Name manager TID for secondary thread %d\n", secQPtr->GetNameTID());
-
- // Close both main and secondary queues
-
- CloseQueue();
- secQPtr->CloseQueue();
-
- // Destroy secondary queue
-
- DestroyQueue(secQPtr);
-
- printf("Good Bye!\n");
- }
-
- // Invoked when a message is received by the main queue (invoked multiple times)
-
- void MainReceive(mMessage *msgPtr)
- {
- tid_type temp;
-
- // Swap TID
-
- temp = msgPtr->mFrom;
- msgPtr->mFrom = msgPtr->mTo;
- msgPtr->mTo = temp;
-
- msgPtr->mCode += 1; // increment code to indicate it is a reply
-
- msgPtr->mOData[1] = TickCount(); // get the current time in mOData[1]
-
- Send(msgPtr); // send using the main Queue
- }
-
- // These N completion routines each invoked by the corresponday reply message
- //
- // Reads the current time into mOData[2] and sets corresponding msgRecd and frees the message
-
- void SecReceive0(mMessage *msgPtr)
- {
- if (msgPtr) {
- msgPtr->mOData[2] = TickCount();
- msgRecd[0] = msgPtr;
- secQPtr->FreeMsg(msgPtr);
- }
- else {
- msgRecd[0] = (mMessage *)-1;
- }
- }
-
- void SecReceive1(mMessage *msgPtr)
- {
- if (msgPtr) {
- msgPtr->mOData[2] = TickCount();
- msgRecd[1] = msgPtr;
- secQPtr->FreeMsg(msgPtr);
- }
- else {
- msgRecd[1] = (mMessage *)-1;
- }
- }
-
- void SecReceive2(mMessage *msgPtr)
- {
- if (msgPtr) {
- msgPtr->mOData[2] = TickCount();
- msgRecd[2] = msgPtr;
- secQPtr->FreeMsg(msgPtr);
- }
- else {
- msgRecd[2] = (mMessage *)-1;
- }
- }
-
- void SecReceive3(mMessage *msgPtr)
- {
- if (msgPtr) {
- msgPtr->mOData[2] = TickCount();
- msgRecd[3] = msgPtr;
- secQPtr->FreeMsg(msgPtr);
- }
- else {
- msgRecd[3] = (mMessage *)-1;
- }
- }
-